package Controleur;

import java.util.ArrayList;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Iterator;

import javax.swing.JDialog;

import org.openstreetmap.gui.jmapviewer.Coordinate;
import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;

import DAO.DAOStation;
import Modele.Station;
import Vue.Map;
import Vue.StationFrame;
import Vue.AjoutStation;

/** Définit l'écouteur de souris sur la map */
public class Map_event implements MouseListener {

	/** La map */
	private Map map;
	/** La vue d'ajout d'une station */
	private AjoutStation frame_ajoutStation;
	/** Le listener d'ajout station par click sur la map */
	private AjoutStationCarteListener listn_ajoutStation;

	/**
	 * Instancie l'écouteur
	 * 
	 * @param m
	 *            La map
	 */
	public Map_event(Map m) {
		this.map = m;
		this.frame_ajoutStation = null;
		this.listn_ajoutStation = null;
	}

	/**
	 * Instancie l'écouteur
	 * 
	 * @param m
	 *            La map
	 * @param frame_ajoutStation
	 *            La vue d'ajout d'une station
	 * @param listn_ajoutStation
	 *            Le listener d'ajout station par click sur la map
	 */
	public Map_event(Map m, AjoutStation frame_ajoutStation,
			AjoutStationCarteListener listn_ajoutStation) {
		this.map = m;
		this.frame_ajoutStation = frame_ajoutStation;
		this.listn_ajoutStation = listn_ajoutStation;
	}

	/**
	 * Action lors de l'évenement
	 * 
	 * @param e
	 *            Objet de l'évenement
	 */
	@Override
	public void mouseClicked(MouseEvent e) {

		if (e.getClickCount() == 1 && e.getButton() == MouseEvent.BUTTON1) {

			Point p = e.getPoint();
			int X = p.x + 3;
			int Y = p.y + 3;
			if (frame_ajoutStation == null) {

				ArrayList<MapMarker> ar = new ArrayList<MapMarker>(
						map.getMapMarkerList());
				Iterator<MapMarker> i = ar.iterator();

				while (i.hasNext()) {

					MapMarker mapMarker = (MapMarker) i.next();

					Point MarkerPosition = map.getMapPosition(
							mapMarker.getLat(), mapMarker.getLon());
					if (MarkerPosition != null) {

						int centerX = MarkerPosition.x;
						int centerY = MarkerPosition.y;

						// calculate the radius from the touch to the center of
						// the
						// dot
						double radCircle = Math
								.sqrt((((centerX - X) * (centerX - X)) + (centerY - Y)
										* (centerY - Y)));

						// if the radius is smaller then 23 (radius of a ball is
						// 5),
						// then it must be on the dot
						if (radCircle < 8) {
							Station station = DAOStation
									.getStationById(mapMarker.getIdStation());
							StationFrame frame = new StationFrame(
									station.getIdStation(),
									station.getIntitule(),
									station.getNbMaxVelo(), station
											.getStationnementsActuels().size(),
									map);
							frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
							frame.setVisible(true);

						}
					}
				}
			} else {
				// Cas de l'ajout d'une station par click sur la map

				Coordinate coord = map.getPosition(X, Y);

				frame_ajoutStation.getField_X().setText(
						String.valueOf(truncateDouble(coord.getLat(), 6))
								.replace('.', ','));
				frame_ajoutStation.getField_Y().setText(
						String.valueOf(truncateDouble(coord.getLon(), 6))
								.replace('.', ','));

				// On relance le test de validation
				listn_ajoutStation.ajoutStation_estValide();

			}
		}

	}

	/**
	 * Tronque un double à une précision donnée
	 * 
	 * @param number
	 *            Le nombre à tronquer
	 * @param numDigits
	 *            La précision
	 * @return Le nombre tronqué
	 */
	double truncateDouble(double number, int numDigits) {
		double result = number;
		String arg = "" + number;
		int idx = arg.indexOf('.');
		if (idx != -1) {
			if (arg.length() > idx + numDigits) {
				arg = arg.substring(0, idx + numDigits + 1);
				result = Double.parseDouble(arg);
			}
		}
		return result;
	}

	/**
	 * Action lors de l'évenement
	 * 
	 * @param e
	 *            Objet de l'évenement
	 */
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	/**
	 * Action lors de l'évenement
	 * 
	 * @param e
	 *            Objet de l'évenement
	 */
	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	/**
	 * Action lors de l'évenement
	 * 
	 * @param e
	 *            Objet de l'évenement
	 */
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	/**
	 * Action lors de l'évenement
	 * 
	 * @param e
	 *            Objet de l'évenement
	 */
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub

	}

}
